package messages

import (
	"time"

	"github.com/asynkron/protoactor-go/actor"
)

// WorkflowCommand 是所有工作流命令的基础接口
type WorkflowCommand interface {
	isWorkflowCommand()
}

// WorkflowResponse 是所有工作流响应的基础接口
type WorkflowResponse interface {
	isWorkflowResponse()
}

// DeployWorkflowCommand 是部署工作流的命令
type DeployWorkflowCommand struct {
	// WorkflowID 是工作流的ID
	WorkflowID string
	// Definition 是工作流定义
	Definition interface{}
}

func (*DeployWorkflowCommand) isWorkflowCommand() {}

// DeployWorkflowResponse 是对DeployWorkflowCommand的响应
type DeployWorkflowResponse struct {
	// Success 表示操作是否成功
	Success bool
	// Error 是操作失败时的错误消息
	Error string
	// WorkflowPID 是工作流actor的PID
	WorkflowPID *actor.PID
}

func (*DeployWorkflowResponse) isWorkflowResponse() {}

// StartWorkflowCommand 是启动工作流的命令
type StartWorkflowCommand struct {
	// WorkflowID 是工作流的ID
	WorkflowID string
	// Parameters 是工作流参数
	Parameters map[string]interface{}
}

func (*StartWorkflowCommand) isWorkflowCommand() {}

// StartWorkflowResponse 是对StartWorkflowCommand的响应
type StartWorkflowResponse struct {
	// Success 表示操作是否成功
	Success bool
	// Error 是操作失败时的错误消息
	Error string
	// RunID 是工作流运行的ID
	RunID string
}

func (*StartWorkflowResponse) isWorkflowResponse() {}

// StopWorkflowCommand 是停止工作流的命令
type StopWorkflowCommand struct {
	// RunID 是工作流运行的ID
	RunID string
}

func (*StopWorkflowCommand) isWorkflowCommand() {}

// StopWorkflowResponse 是对StopWorkflowCommand的响应
type StopWorkflowResponse struct {
	// Success 表示操作是否成功
	Success bool
	// Error 是操作失败时的错误消息
	Error string
}

func (*StopWorkflowResponse) isWorkflowResponse() {}

// GetWorkflowStatusCommand 是获取工作流状态的命令
type GetWorkflowStatusCommand struct {
	// RunID 是工作流运行的ID
	RunID string
}

func (*GetWorkflowStatusCommand) isWorkflowCommand() {}

// GetWorkflowStatusResponse 是对GetWorkflowStatusCommand的响应
type GetWorkflowStatusResponse struct {
	// Success 表示操作是否成功
	Success bool
	// Error 是操作失败时的错误消息
	Error string
	// Status 是工作流状态
	Status string
	// Progress 是工作流进度(0-100)
	Progress int
	// StartTime 是工作流开始时间
	StartTime time.Time
	// EndTime 是工作流结束时间
	EndTime time.Time
	// NodeStatuses 是工作流节点状态
	NodeStatuses map[string]string
}

func (*GetWorkflowStatusResponse) isWorkflowResponse() {}

// ListWorkflowsCommand 是列出工作流的命令
type ListWorkflowsCommand struct{}

func (*ListWorkflowsCommand) isWorkflowCommand() {}

// ListWorkflowsResponse 是对ListWorkflowsCommand的响应
type ListWorkflowsResponse struct {
	// Workflows 是工作流列表
	Workflows []*WorkflowInfo
}

func (*ListWorkflowsResponse) isWorkflowResponse() {}

// WorkflowInfo 表示工作流信息
type WorkflowInfo struct {
	// ID 是工作流ID
	ID string
	// Name 是工作流名称
	Name string
	// Description 是工作流描述
	Description string
	// Version 是工作流版本
	Version string
	// Status 是工作流状态
	Status string
	// CreatedAt 是工作流创建时间
	CreatedAt time.Time
	// UpdatedAt 是工作流更新时间
	UpdatedAt time.Time
}

// ListWorkflowInstancesCommand 是列出工作流实例的命令
type ListWorkflowInstancesCommand struct {
	// WorkflowID 是工作流ID
	WorkflowID string
}

func (*ListWorkflowInstancesCommand) isWorkflowCommand() {}

// ListWorkflowInstancesResponse 是对ListWorkflowInstancesCommand的响应
type ListWorkflowInstancesResponse struct {
	// Instances 是工作流实例列表
	Instances []*WorkflowInstanceInfo
}

func (*ListWorkflowInstancesResponse) isWorkflowResponse() {}

// WorkflowInstanceInfo 表示工作流实例信息
type WorkflowInstanceInfo struct {
	// ID 是实例ID
	ID string
	// WorkflowID 是工作流ID
	WorkflowID string
	// Status 是实例状态
	Status string
	// StartTime 是实例开始时间
	StartTime time.Time
	// EndTime 是实例结束时间
	EndTime time.Time
	// Error 是实例失败时的错误
	Error string
}
